package com.tbit.uqbike.webmanager.dao.capital;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.tbit.config.datasource.DataSource;
import com.tbit.uqbike.object.pojo.NameCount;
import com.tbit.uqbike.object.pojo.RideLogDetails;
import com.tbit.uqbike.object.pojo.RideLogDetailsUpdate;
import com.tbit.uqbike.object.pojo.dto.RideLogDetailsQueryDTO;
import com.tbit.manager.api.dto.OrderStatReturnDTO;
import com.tbit.uqbike.object.pojo.vo.AdopterOperatingStat;
import com.tbit.uqbike.object.pojo.vo.RideLogDetailsSumVO;
import com.tbit.uqbike.object.pojo.vo.RideLogDetailsVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Author:BUGTian
 * @DATE: 2022/11/12
 */
@DS(DataSource.CAPITAL)
public interface RideLogDetailsDao {
    /**
     * 查询骑行订单详情
     *
     * @param queryDTO
     * @return
     */
    List<RideLogDetails> selectList(RideLogDetailsQueryDTO queryDTO);

    /**
     * 查询骑行订单详情
     *
     * @param queryDTO .
     * @return .
     */
    Integer selectDataCount(RideLogDetailsQueryDTO queryDTO);

    /**
     * 骑行订单统计
     *
     * @param queryDTO
     * @return
     */
    RideLogDetailsSumVO sum(RideLogDetailsQueryDTO queryDTO);

    /**
     * 骑行记录
     *
     * @param brandId
     * @param accountIdList
     * @param phone
     * @param userCode
     * @return
     */
    List<RideLogDetailsVO> queryCyclingRecord(@Param("brandId") Integer brandId, @Param("accountIdList") List<Integer> accountIdList, @Param("phone") String phone, @Param("userCode") String userCode);

    /**
     * 查询用户最新一条订单骑行记录
     *
     * @param userId 用户id
     * @return
     */
    RideLogDetails queryLatestCyclingOrder(@Param("userId") Integer userId);

    /**
     * 人工修改订单金额更新骑行记录
     *
     * @param rideLogDetailsUpdate
     */
    void updateByOrderId(RideLogDetailsUpdate rideLogDetailsUpdate);

    /**
     * 根据订单编号查询订单详情
     *
     * @param orderId
     * @return
     */
    RideLogDetailsVO queryByOrderId(@Param("orderId") String orderId);

    /**
     * 修改订单支付状态
     *
     * @param orderId        订单编号
     * @param operaTime      操作时间
     * @param actualPayMoney 实际支付金额
     * @param operatorId     操作人id
     * @param operatorPhone  操作人手机号
     * @param operatorName   操作人名称
     * @param remark         操作备注
     */
    void updatePayStatusByOrderId(@Param("orderId") String orderId, @Param("operaTime") Date operaTime, @Param("actualPayMoney") long actualPayMoney, @Param("operatorId") Integer operatorId, @Param("operatorPhone") String operatorPhone, @Param("operatorName") String operatorName, @Param("remark") String remark);

    /**
     * 统计罚款费用
     * @param reMap map
     * @return NameCount
     */
    NameCount countFineByAidsExDt(Map<String, Object> reMap);


    int insertBatch(@Param("rideLogDetails") List<RideLogDetails> rideLogDetails);


    RideLogDetails getByOrderId(@Param("orderId") String orderId);

    /**
     * @description: 根据传入的里程区间、时间段获取每天、每个里程区间的订单数
     * @author: mo.shanyong
     * @date: 2025/3/10 19:25
     * @param: accountId 区域Id
     * @param: startDate 开始时间
     * @param: endDate 结束时间
     * @param: mileageIntervalList 区间集合
     * @return: java.util.List<com.tbit.manager.api.dto.OrderStatReturnDTO>
     */
    List<OrderStatReturnDTO> getOrderMileageData(@Param("accountId") Integer accountId, @Param("startDate") Date startDate,
                                              @Param("endDate") Date endDate);
    /**
     * @description: 获取订单支付方式饼图数据(骑行卡、优惠劵、会员卡等)
     * @author: mo.shanyong
     * @date: 2025/3/11 11:18
     * @param: accountId 区域id
     * @param: startDate 筛选开始时间
     * @param: endDate 筛选结束时间
     * @return: com.tbit.manager.api.dto.OrderStatReturnDTO
     */
    List<OrderStatReturnDTO> getOrderPayTypeData(@Param("accountId") Integer accountId, @Param("startDate") Date startDate,
                                        @Param("endDate") Date endDate);

    /**
     * @description: 获取结束订单时车辆的位置统计数据(站外、超区、正常)
     * @author: mo.shanyong
     * @date: 2025/3/11 13:39
     * @param: accountId 区域id
     * @param: startDate 筛选开始时间
     * @param: endDate 筛选结束时间
     * @return: com.tbit.manager.api.dto.OrderStatReturnDTO
     */
    List<OrderStatReturnDTO> getOrderFinishTypeData(@Param("accountId") Integer accountId, @Param("startDate") Date startDate,
                                           @Param("endDate") Date endDate);

    /**
     * @description: 获取时间段内区域的订单的骑行时长的分布数据
     * @author: mo.shanyong
     * @date: 2025/3/14 9:11
     * @param: accountId 区域id
     * @param: startDate 开始时间 2025-03-01 00:00:00
     * @param: endDate 结束时间 2025-03-01 23:59:59
     * @return: java.util.List<com.tbit.manager.api.dto.OrderStatReturnDTO>
     */
    List<OrderStatReturnDTO> getOrderTimeDistribution(@Param("accountId") Integer accountId, @Param("startDate") Date startDate,
                                                 @Param("endDate") Date endDate);

    /**
     * @description: 按天统计领养人订单数据
     * @author wangweibin
     * @date 2025/4/16
     * @param accountUserId
     * @param adAccountId
     * @param startTime
     * @param endTime
     * @param machineCount
     * @param machineIds
     * @return List<AdopterOperatingStat>
     */
    List<AdopterOperatingStat> selectAdopterOperatingStat(@Param("accountUserId") Integer accountUserId, @Param("adAccountId") Integer adAccountId,
                                                          @Param("startTime") Date startTime, @Param("endTime") Date endTime,
                                                          @Param("machineCount") Integer machineCount, @Param("machineIds") List<Integer> machineIds);
    /**
     * @description: 统计用户的订单数
     * @author: mo.shanyong
     * @date: 2025/5/19 10:36
     * @param: userId 用户id
     * @return: int
     */
    int countByUserId(Integer userId);

}
